package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

func indexHandler(c *gin.Context) {
	fmt.Println("index...")
	name, ok := c.Get("name") //从上下文中取值（跨中间件存取值）
	if !ok {
		name = "匿名用户"
	}
	c.JSON(http.StatusOK, gin.H{
		"msg": name,
	})
}

//定义一个中间件m1:统计耗时
func m1(c *gin.Context) {
	fmt.Println("m1 in...")
	//计时
	start := time.Now()
	//go funcXX(c.Copy()) //在funcXX中只能使用c的拷贝
	c.Next() //调用后续的处理函数
	//c.Abort() //阻止调用后续的处理函数
	cost := time.Since(start)
	fmt.Printf("cost:%v \n", cost)
	fmt.Println("m1 out...")
}

func m2(c *gin.Context) {
	fmt.Println("m2 in...")
	c.Set("name", "zjd") //在上下文中设置值
	c.Next()             //调用后续的处理函数
	fmt.Println("m2 out...")
}

func m3(c *gin.Context) {
	fmt.Println("m3 in...")
	c.Abort() //阻止调用后续的处理函数
	fmt.Println("m3 out...")
}

func authMiddleware(doCheck bool) gin.HandlerFunc {
	//连接数据库工作
	//或者一些其他准备
	fmt.Println("authMiddleware...") //此行不打印，不知道是什么原因
	return func(c *gin.Context) {
		//存放具体的逻辑
		if doCheck {
			fmt.Println("authMiddleware if in...")
			//是否登录判断
			//if 是登录用户
			c.Next()
			//else
			//c.Abort
			fmt.Println("authMiddleware if out...")
		} else {
			fmt.Println("authMiddleware else in...")
			c.Next()
			fmt.Println("authMiddleware else out...")
		}
	}
}

//中间件
func main() {
	r := gin.Default() //默认使用了logger()和Recovery()中间件
	//r:=gin.New()
	r.Use(m1, m2) //全局注册中间件函数m1,m2,添加m3之后，不会执行后续的内容
	r.GET("/index", indexHandler)
	r.GET("/shop", func(c *gin.Context) {
		fmt.Println("shop...")
		c.JSON(http.StatusOK, gin.H{
			"msg": "shop",
		})
	})
	r.GET("/user", func(c *gin.Context) {
		fmt.Println("user...")
		c.JSON(http.StatusOK, gin.H{
			"msg": "user",
		})
	})
	//路由组注册中间件办法1：
	xxGroup := r.Group("/xx", authMiddleware(true))
	{
		xxGroup.GET("/index", func(c *gin.Context) {
			fmt.Println("/xx/index...")
			c.JSON(http.StatusOK, gin.H{
				"msg": "xxGroup",
			})
		})
	}
	//路由组注册中间件方法2：
	xx2Group := r.Group("/xx2")
	xx2Group.Use(authMiddleware(false))
	{
		xx2Group.GET("/index", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{
				"msg": "x2xGroup",
			})
		})
	}

	r.Run(":9090")
}
